package top.yinjinbiao.demo.netty.custom.arom;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class AROMDecoder extends ByteToMessageDecoder {

    // 起始字节1(1byte) 起始字节2(1byte) 帧长(1byte)
    public final int BASE_LENGTH = 3;

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        if (byteBuf.readableBytes()>=BASE_LENGTH){
            if (byteBuf.readableBytes()>2048){
                byteBuf.skipBytes(byteBuf.readableBytes());
            }

            // 记录包头开始的index
            int beginReader;
            while(true){
                // 获取包头开始的index
                beginReader = byteBuf.readerIndex();

                // 标记包头开始的index
                byteBuf.markReaderIndex();

                // 读取到数据包开头
                if(byteBuf.readInt() == AROMConstant.HEAD_DATA_1){
                    if(byteBuf.readInt() == AROMConstant.HEAD_DATA_2){
                        break;
                    }
                }

                // 未读到包头，略过一个字节
                byteBuf.resetReaderIndex();
                byteBuf.readByte();

                // 当略过一个字节后，如果数据包的长度不满足，应该结束
                if(byteBuf.readableBytes()<BASE_LENGTH){
                    return;
                }

            }
            // 消息的长度
            int length = byteBuf.readInt();
            // 判断请求数据包数据是否到齐
            if (byteBuf.readableBytes() < length) {
                // 还原读指针
                byteBuf.readerIndex(beginReader);
                return;
            }

            // 读取data数据
            byte[] data = new byte[length];
            byte hostId=data[0],commandCode=data[1],crc=data[data.length-1];
            byte[] param = {data[2],data[3],data[4],data[5]};
            byteBuf.readBytes(data);

            AROMDataPackage protocol = new AROMDataPackage((byte) data.length, hostId, commandCode,param,crc);
            list.add(protocol);

        }
    }
}
